<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link rel="stylesheet" href="/js/prism.css">
    <link rel="stylesheet" href="/css/app.css">
    <title>cookie and session - 叫兽</title>
    <link rel="icon" type="image/x-icon" class="js-site-favicon" href="/img/favicon.ico">
  </head>
  <body>

        <div class="container bg-white pb-5 px-5 spx-0">
            
            <h1 class="post-title">cookie and session</h1>




            <h2>cookie</h2><p>cookie 本质上完全是由浏览器客户端来管理的一种数据，这种方式的发明最开始主要是为了记录客户端的用户信息，做用户身份识别，为了让服务器端知道现在的请求和昨天的请求是不是同一个人，他是那一个人。由浏览器创建，保存于浏览器，由浏览器管理他的生命周期。只要在合法的域下面，有相关的 cookie 设置，浏览器会自动把 cookie 带上 Request Headers 提交到服务器端。</p><p>用户在同一个域下访问网站，客户端浏览器会始终 通过Requet Headers 带着 cookie到服务器端，用户在同一个浏览器上打开多个 tab 访问同一个网址，也会这样做，浏览器会带着样 cookie 到后端。</p><p><img src="/static/2018/11/img/094333.png" alt="" /></p><p>虽然cookie是由浏览器端生成，但也可以由服务器端通过Respoinse Headers传给浏览器操作cookie的命令来生成，这样后端也可以通过Response Headers来创建、修改、删除客户端的cookie，然后保存于客户端浏览器。</p><p><img src="/static/2018/11/img/095641.png" alt="" /></p><h3>cookie域限制</h3><p>由于cookie有很强大域限制，因此不管是客户端 js 操作 cookie 还是服务器端通过Respoinse Headers来操作cookie，cookie的生成必须符合域的合法范围，否则会生成失败。同时如果跨域获取 cookie 也会失败。</p><p>比如，在域名www.b.com和www.a.com下：</p><p>b.com<br /> hello.b.com<br /> cool.b.com<br /></p><p>在b.com下，可以设置b.com下的 cookie，不可以设置二级域名的cookie，设置了也是失败。</p><p><strong>子域名共享顶级域名的cookie</strong></p><p>在hello.b.com下，可以设置hello.b.com下的cookie，也可以设置b.com下的cookie。同时也可以获取hello.b.com下的cookie和b.com下的cookie。</p><p><strong>path限制</strong><br /> 同一个域名下www.b.com(path为/), www.b.com/hello(path为/hello), www.b.com/cool(path为/cool), 和域名限制类似，/hello下可以访问/hello 下的cookie和/下的cookie，访问不到/cool下的cookie。</p><pre><code class=".language-javascript">
// 在www.b.com下
document.cookie=&quot;root=123;&quot;;
// 在Application/Storage/Cookies中，可以看到cookie root创建成功，它path是/
document.cookie
&quot;root=123&quot;

// 在www.b.com/hello下
document.cookie
&quot;root=123&quot;
// 证明path /hello下可以拿到 path / 中的 cookie

document.cookie=&quot;hello=345;&quot;;
// 在Application/Storage/Cookies中，可以看到cookie root创建成功，它path是/hello
document.cookie
&quot;root=123;hello=345&quot;

// 在www.b.com下
document.cookie
&quot;root=123&quot;
// 证明path / 下拿不到 path /hello 中的 cookie

document.cookie=&quot;base=567;&quot;;
document.cookie
&quot;root=123;base=567&quot;

// 在www.b.com/hello下
document.cookie
&quot;root=123;base=567;hello=345&quot;

// 在www.b.com/cool下
document.cookie
&quot;root=123;base=567&quot;
// 证明path /cool下可以拿到 path / 中的 cookie

document.cookie=&quot;coll=789;&quot;
document.cookie
&quot;root=123;base=567;cool=789&quot;

// 在www.b.com/hello下
document.cookie
&quot;root=123;base=567;hello=345&quot;
// 证明path /hello中拿不到path /cool 下的 cookie

document.cookie=&quot;hello3=bbb;path=/&quot;
document.cookie
&quot;root=123;base=567;hello=345;hello3=bbb&quot;

// 在www.b.com下
document.cookie
&quot;root=123;base=567;hello3=bbb&quot;
// 证明 /hello 下可以设置 / 下的 cookie

// 在www.b.com/cool下
document.cookie
&quot;root=123;base=567;cool=789;hello3=bbb&quot;
// 证明 /hello 下可以设置 / 下的 cookie，也可以在/cool中拿到

</code></pre><p><br></p><h2>session</h2>
            <p class="text-left text-muted">2018-12-03 13:45</p>
        </div>
        <div class="container">
            <div class="row mt-4">
                <div class="col-6 text-left"><a href="/p/2018/12/4/做一个和骚扰电话聊天的机器人/">上一篇: 做一个和骚扰电话聊天的机器人</a></div>
                <div class="col-6 text-right"><a href="/p/2018/11/27/clojure-future-promise/">下一篇:future and promise in clojure</a></div>
            </div>
        </div>

        <button class="btn btn-link m-menu-toggle d-md-none fixed-top collapsed" type="button" data-toggle="collapse" data-target="#m-menu" aria-controls="m-menu" aria-expanded="false" aria-label="Toggle docs navigation"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" width="30" height="30" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M4 7h22M4 15h22M4 23h22"></path></svg>
        </button>
        <ul class="nav flex-column collapse fixed-top site-menu d-md-block" id="m-menu">
            <li class="nav-item">
                <a class="nav-link" href="/">首页</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="/p/list/">所有文章</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="/p/about-me/">关于我</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="https://github.com/arlicle">Github</a>
          </li>
        </ul>

        
    <div class="container mt-5">
        <h3>留言</h3>
        <div id="commentApp"></div>
    </div>
    <script>
        var AL_configs = {
            "post_id":"/p/2018/11/29/cookie-and-session/",
            "appid":"847e226e8a46f64045d45312245a68ba1368a564"
        };
        (function() {
            var hm = document.createElement("script");
            hm.src = "https://comment.debugmyself.com/sc.js";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
        })();
    </script>


        <footer class="footer mt-5 pb-2">
        <div class="container text-center">
          
          <p><span class="text-black-50">Powered by <a href="https://github.com/arlicle/ablog">ablog</a> © 2019 叫兽</span></p>
          <p><span class="text-black-50"><a href="http://www.beian.miit.gov.cn/">滇ICP备10201832号-3</a></span></p>
          
        </div>
        </footer>
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
        <script src="/js/prism.js"></script>
        <script>
        $(function () {
            $('[data-toggle="tooltip"]').tooltip();
        })
        </script>
        <script type="text/x-mathjax-config">
        MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}, displayAlign: "left",scale: 180});
        </script>
        <script type="text/javascript" async
        src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_SVG" async>
        </script>
  </body>
</html>